package org.streets.workflow.engine;

import java.util.Date;

import org.streets.workflow.model.WFTask;
import org.streets.workflow.model.net.WFActivity;


/**
 * 任务实例<br>
 * 对任务实例的状态字段作如下规定：小于5的状态为“活动”状态，大于等于5的状态为“非活动”状态。<br>
 * 活动状态包括：INITIALIZED,RUNNING,SUSPENDED<br>
 * 非活动状态包括：COMPLETED,CANCELED
 * 
 */
public interface ITaskInstance {
	/**
	 * 初始化状态
	 */
	public static final int INITIALIZED = 0;

	/**
	 * 运行状态
	 */
	public static final int RUNNING = 1;
	
	/**
	 * 已经结束
	 */
	public static final int COMPLETED = 7;

	/**
	 * 被撤销
	 */
	public static final int CANCELED = 9;

	/**
	 * 返回任务实例的Id
	 * 
	 * @return
	 */
	public String getId();
    /**
     * 返回任务Name
     * 
     * @return
     */
    public String getName();
	/**
	 * 返回对应的任务Id
	 * 
	 * @return
	 */
	public String getTaskModelId();
	/**
	 * 获取流程实例
	 * @return
	 */
	public IProcessInstance getProcess();
	/**
	 * 设置当前流程 
	 */
	public void setProcess(IProcessInstance process);
	
	
//
//	/**
//	 * 返回对应的流程的Id
//	 * 
//	 * @return
//	 */
//	public String getDefinitionId();
//
//	/**
//	 * 返回流程的版本
//	 * 
//	 * @return
//	 */
//	public Integer getVersion();

	/**
	 * 返回任务实例创建的时间
	 * 
	 * @return
	 */
	public Date getCreatedTime();

	/**
	 * 返回任务实例启动的时间
	 * 
	 * @return
	 */
	public Date getStartedTime();

	/**
	 * 返回任务实例结束的时间
	 * 
	 * @return
	 */
	public Date getEndTime();

	/**
	 * 返回任务实例到期日期
	 * 
	 * @return
	 */
	public Date getExpiredTime();// 过期时间

	/**
	 * 返回任务实例的状态，取值为：INITIALIZED(已初始化），STARTED(已启动),COMPLETED(已结束),CANCELD(被取消)
	 * 
	 * @return
	 */
	public Integer getState();

	/**
	 * 返回任务实例的分配策略，取值为 org.fireflow.model.Task.ALL或者org.fireflow.model.Task.ANY
	 * 
	 * @return
	 */
	public String getAssignStrategy();

	/**
	 * 返回任务实例所属的环节的Id
	 * 
	 * @return
	 */
	public String getActivityModelId();

	/**
	 * 返回任务类型，取值为org.fireflow.model.Task.FORM,org.fireflow.model.Task.TOOL,
	 * org.fireflow.model.Task.SUBFLOW或者org.fireflow.model.Task.DUMMY
	 * 
	 * @return
	 */
	public String getTaskType();

	/**
	 * 返回任务是里对应的环节
	 * 
	 * @return
	 * @throws org.WorkflowException.engine.EngineException
	 */
	public WFActivity getActivityModel() throws WorkflowException;

	/**
	 * 返回任务实例对应的Task对象
	 * 
	 * @return
	 * @throws org.WorkflowException.engine.EngineException
	 */
	public WFTask getTaskModel() throws WorkflowException;

	/**
	 * 当执行JumpTo和LoopTo操作时，返回目标Activity 的Id
	 * 
	 * @return
	 */
	public String getTargetActivityId();

	/**
	 * 返回TaskInstance的"步数"。
	 * 
	 * @return
	 */
	public Integer getStepNum();

	/**
	 * 是否已经挂起
	 * @return
	 */
	public Boolean isSuspended();
//    /**
//     * 挂起
//     * 
//     * @throws org.WorkflowException.engine.EngineException
//     */
//    public void suspend() throws WorkflowException;
//
//	/**
//	 * 从挂起状态恢复到挂起前的状态
//	 * 
//	 * @throws org.WorkflowException.engine.EngineException
//	 */
//	public void restore() throws WorkflowException;
//
//	/**
//	 * 将该TaskInstance中止，并且使得当前流程实例按照流程定义往下流转。</br>
//	 * 与该TaskInstance相关的WorkItem都被置为Canceled状态。</br>
//	 * 如果该TaskInstance的状态已经是Completed或者Canceled，则抛出异常。</br>
//	 * @throws WorkflowException
//	 */
//	public void abort() throws WorkflowException;
//	
//	/**
//	 * 将该TaskInstance中止，并且使得当前流程实例跳转到targetActivityId指定的环节。</br>
//	 * 与该TaskInstance相关的WorkItem都被置为Canceled状态。</br>
//	 * 如果该TaskInstance的状态已经是Completed或者Canceled，则抛出异常。</br>
//	 * @param targetActivityId
//	 * @throws WorkflowException
//	 * @throws KernelException
//	 */
//	public void abort(String targetActivityId) throws WorkflowException;
//	
//	/**
//	 * 将该TaskInstance中止，并且使得当前流程实例跳转到targetActivityId指定的环节。该环节任务的操作人从dynamicAssignmentHandler获取。</br>
//	 * 当前环节和目标环节 可以不在 同一条“执行线”上</br>
//	 * 与该TaskInstance相关的WorkItem都被置为Canceled状态。</br>
//	 * 如果该TaskInstance的状态已经是Completed或者Canceled，则抛出异常。</br>
//	 * @param targetActivityId
//	 * @param dynamicAssignmentHandler
//	 * @throws WorkflowException
//	 * @throws KernelException
//	 */
//	public void abort(String targetActivityId,DynamicAssignmentHandler dynamicAssignmentHandler) throws WorkflowException;

}
